home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 1 Issue 2 / PDCD-1 - Issue 02.iso / _utilities / utilities / 001 / oc / !OC_c_oc < prev    next >
Encoding:
Text File  |  1994-11-10  |  3.7 KB  |  3 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef void (*fptr)(); typedef void (*actn)(); struct fsmcell { actn action; unsigned char nextstate; }; FILE *fileout,*filein; int main(int argc,char *argv[]); void fsm(int c); void prefsm(int c); int premap(int c); int map(int c); void null(int c, fptr vec); void outc(int c, fptr vec); void W(int c, fptr vec); void Wc(int c, fptr vec); void SL(int c, fptr vec); void SLc(int c, fptr vec); void err(int c, fptr vec); void pchar(int c); void NL(int c, fptr vec); void NLc(int c, fptr vec); void BSLc(int c, fptr vec); void WSL(int c, fptr vec); void WSLc(int c, fptr vec); void NLSL(int c, fptr vec); void NLSLc(int c, fptr vec); static struct fsmcell prestab[6][4] = { outc,1, null,0, outc,3, outc,1, null,4, null,2, outc,1, outc,1, Wc,1, null,2, NLc,3, Wc,1, null,5, outc,0, outc,3, outc,3, BSLc,1, null,1, BSLc,1, BSLc,1, BSLc,3, null,3, BSLc,3, BSLc,3 }; static struct fsmcell stab[16][8] = { null,2, outc,0, null,1, null,9, outc,5, outc,7, outc,0, outc,0, null,10, Wc,0, null,1, null,9, Wc,5, Wc,7, Wc,0, Wc,0 , err,0, null,3, SL,1, SL,9, err,0, err,0, err,0, SLc,0 , null,3, null,4, null,3, null,3, null,3, null,3, null,3, null,3, null,0, null,4, null,3, null,3, null,3, null,3, null,3, null,3, outc,5, outc,5, outc,5, err,0, outc,0, outc,5, outc,6, outc,5, outc,5, outc,5, outc,5, err,5, outc,5, outc,5, outc,5, outc,5, outc,7, outc,7, outc,7, err,0, err,0, outc,0, outc,8, outc,7, outc,7, outc,7, outc,7, err,7, outc,7, outc,7, outc,7, outc,7, null,13, NLc,0, null,9, null,9, NLc,5, NLc,7, NLc,0, NLc,0, err,0, null,11, WSL,1, WSL,9, err,0, err,0, err,0, WSLc,0, null,11, null,12, null,11, null,11, null,11, null,11, null,11, null,11, null,1, null,12, null,11, null,11, null,11, null,11, null,11, null,11, err,0, null,14, NLSL,1, NLSL,9, err,0, err,0, err,0, NLSLc,0, null,14, null,15, null,14, null,14, null,14, null,14, null,14, null,14, null,9, null,15, null,14, null,14, null,14, null,14, null,14, null,14 }; int main(int argc,char *argv[]) { int c; if (argc!=3) { fprintf(stderr,"Syntax : oc [infile] [outfile]\n"); exit(1); } filein=fopen(argv[1],"rb"); fileout=fopen(argv[2],"wt"); if(filein==NULL || fileout==NULL) { fprintf(stderr,"File error\n"); exit(1); } while(c = fgetc(filein), c != EOF) prefsm(c); fclose(filein); fclose(fileout); } void prefsm(c) int c; { static unsigned char state = 0; struct fsmcell *cp; int input; input = premap(c); cp = &prestab[state][input]; (*cp->action)(c,fsm); state = cp->nextstate; } int premap(int c) { switch(c) { case '\\': return(0); case '\n': return(1); case '#': return(2); default: return(3); } } void fsm(int c) { static unsigned char state = 0; struct fsmcell *cp; int input; input = map(c); cp = &stab[state][input]; (*cp->action)(c,pchar); state = cp->nextstate; } int map(c) int c; { switch(c) { case '/': return(0); case '*': return(1); case ' ': case '\t': return(2); case '\n': return(3); case '\"': return(4); case '\'': return(5); case '\\': return(6); default: return(7); } } void null(int c, fptr vec) { return; } void outc(int c, fptr vec) { (*vec)(c); } void W(int c, fptr vec) { (*vec)(' '); } void Wc(int c, fptr vec) { (*vec)(' '); (*vec)(c); } void SL(int c, fptr vec) { (*vec)('/'); } void SLc(int c, fptr vec) { (*vec)('/'); (*vec)(c); } void err(int c, fptr vec) { printf("\nError\n"); exit(1); } void pchar(int c) { fputc(c,fileout); } void NL(int c, fptr vec) { (*vec)('\n'); } void NLc(int c, fptr vec) { (*vec)('\n'); (*vec)(c); } void BSLc(int c, fptr vec) { (*vec)('\\'); (*vec)(c); } void WSL( int c, fptr vec) { (*vec)(' '); (*vec)('/'); } void WSLc(int c, fptr vec) { (*vec)(' '); (*vec)('/'); (*vec)(c); } void NLSL(int c, fptr vec) { (*vec)('\n'); (*vec)('/'); } void NLSLc(c,vec) int c; fptr vec; { (*vec)('\n'); (*vec)('/'); (*vec)(c); }